home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib04.dsk
/
MAD MAD MAD MAD CUBE.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
13KB
|
338 lines
1 REM ******************************
2 REM ** THE MAD MAD MAD MAD CUBE **
3 REM ** BY RICH HATCHER **
4 REM ** COPYRIGHT (C) 1980 BY **
5 REM ** MICRO-SPARC, INC. **
6 REM ** LINCOLN, MA 01773 **
7 REM ******************************
10 GOTO 2340
20 REM *********************
30 REM DRAW SQUARE AT X,Y
40 FOR W = X TO X +1: VLIN Y,Y +2 AT W: NEXT W
50 RETURN
60 REM *********************
70 REM DRAW BOXES ON SCREEN
80 FOR FA = 0 TO 11: REM FACE
90 FOR RO = 0 TO 2: REM ROW
100 FOR CO = 0 TO 2: REM COLUMN
110 X = (FA - INT(FA/3) *3) *9 +CO *3 +6
120 Y = INT(FA/3) *12 +RO *4
130 COLOR= NC(FA,RO,CO)
140 GOSUB 30
150 NEXT CO: NEXT RO: NEXT FA
160 RETURN
170 REM **********************
180 REM DO EQUIVALENT ROTATES
190 REM ROT CTR CLOCKWISE
200 FOR RO = 0 TO 2: FOR CO = 0 TO 2:HC(RO,CO) = NC(OF,RO,CO): NEXT CO: NEXT RO
210 FOR NR = 0 TO 2: FOR MC = 0 TO 2
220 DR = MC:OC = 2 -NR
230 NC(NF,NR,MC) = HC(DR,OC)
240 NEXT MC: NEXT NR
250 RETURN
260 REM ROT CLOCKWISE
270 FOR RO = 0 TO 2: FOR CO = 0 TO 2:HC(RO,CO) = NC(OF,RO,CO): NEXT CO: NEXT RO
280 FOR NR = 0 TO 2: FOR MC = 0 TO 2
290 DR = 2 -MC:OC = NR
300 NC(NF,NR,MC) = HC(DR,OC)
310 NEXT MC: NEXT NR
320 RETURN
330 REM FACES 0,2,6,8,9,& 11 ARE ROTATED COPIES OF 3 & 5
340 NF = 6:OF = 3: GOSUB 200
350 NF = 8:OF = 5: GOSUB 270
360 NF = 9:OF = 6: GOSUB 200
370 NF = 11:OF = 8: GOSUB 270
380 NF = 0:OF = 9: GOSUB 200
390 NF = 2:OF = 11: GOSUB 270
400 RETURN
410 REM ****************
420 REM ROTATE AXIS
430 IF PDL(1) >200 THEN 620
440 IF PDL(1) <50 THEN 690
450 IF PDL(0) >200 THEN 550
460 IF PDL(0) <50 THEN 480
470 GOTO 430
480 REM ROTATE AXIS LEFT
490 RO = 0: GOSUB 1770
500 NF = 1:OF = 1: GOSUB 270
510 RO = 1: GOSUB 1770
520 RO = 2: GOSUB 1770
530 NF = 7:OF = 7: GOSUB 200
540 GOTO 1950
550 REM ROTATE AXIS RIGHT
560 RO = 0: GOSUB 1700
570 NF = 1:OF = 1: GOSUB 200
580 RO = 1: GOSUB 1700
590 RO = 2: GOSUB 1700
600 NF = 7:OF = 7: GOSUB 270
610 GOTO 1950
620 REM ROTATE AXIS DOWN
630 CO = 0: GOSUB 1600
640 NF = 3:OF = 0: GOSUB 1890
650 CO = 1: GOSUB 1600
660 CO = 2: GOSUB 1600
670 NF = 5:OF = 2: GOSUB 1890
680 GOTO 1950
690 REM ROTATE AXIS UP
700 CO = 0: GOSUB 1530
710 NF = 3:OF = 6: GOSUB 1890
720 CO = 1: GOSUB 1530
730 CO = 2: GOSUB 1530
740 NF = 5:OF = 8: GOSUB 1890
750 GOTO 1950
760 REM *********************
770 REM INPUT MOVES
780 CALL -198: REM BELL
790 GOSUB 1970: REM BLINK
800 X = PEEK( -16287): IF X >128 THEN 840: REM PLAY
810 Y = PEEK( -16384): IF Y >128 THEN 2220: REM END
820 X = PEEK( -16286): IF Z >128 THEN 420: REM FULL ROTATE
830 GOTO 790
840 IF PO$ = "L" THEN 900
850 IF PO$ = "R" THEN 1010
860 IF PO$ = "T" THEN 1120
870 IF PO$ = "B" THEN 1230
880 IF PO$ = "C" THEN 1340
890 REM ********************
900 REM LEFT COLUMN MOVE
910 IF PDL(1) >200 THEN 950
920 IF PDL(1) <50 THEN 980
930 GOTO 910
940 REM MOVE DOWN
950 CO = 0: GOSUB 1600
960 NF = 3:OF = 0: GOSUB 1890: GOTO 1950
970 REM MOVE UP
980 CO = 0: GOSUB 1530
990 NF = 3:OF = 6: GOSUB 1890: GOTO 1950
1000 REM ********************
1010 REM RIGHT COLUMN MOVE
1020 IF PDL(1) >200 THEN 1060
1030 IF PDL(1) <50 THEN 1090
1040 GOTO 1020
1050 REM MOVE DOWN
1060 CO = 2: GOSUB 1600
1070 NF = 5:OF = 2: GOSUB 1890: GOTO 1950
1080 REM MOVE UP
1090 CO = 2: GOSUB 1530
1100 NF = 5:OF = 8: GOSUB 1890: GOTO 1950
1110 REM ********************
1120 REM TOP ROW MOVE
1130 IF PDL(0) >200 THEN 1170
1140 IF PDL(0) <50 THEN 1200
1150 GOTO 1130
1160 REM MOVE RIGHT
1170 RO = 0: GOSUB 1700
1180 NF = 1:OF = 1: GOSUB 200: GOTO 1950
1190 REM MOVE LEFT
1200 RO = 0: GOSUB 1700
1210 NF = 1:OF = 1: GOSUB 270: GOTO 1950
1220 REM ********************
1230 REM BOTTOM ROW MOVE
1240 IF PDL(0) >200 THEN 1280
1250 IF PDL(0) <50 THEN 1310
1260 GOTO 1240
1270 REM MOVE RIGHT
1280 RO = 2: GOSUB 1700
1290 NF = 7:OF = 7: GOSUB 270: GOTO 1950
1300 REM MOVE LEFT
1310 RO = 2: GOSUB 1770
1320 NF = 7:OF = 7: GOSUB 200: GOTO 1950
1330 REM ********************
1340 REM CENTER ROW OR COL MOVE
1350 IF PDL(0) >200 THEN 1410
1360 IF PDL(0) <50 THEN 1440
1370 IF PDL(1) >200 THEN 1470
1380 IF PDL(1) <50 THEN 1500
1390 GOTO 1350
1400 REM MOVE RIGHT
1410 RO = 1: GOSUB 1700
1420 GOTO 1950
1430 REM MOVE LEFT
1440 RO = 1: GOSUB 1770
1450 GOTO 1950
1460 REM MOVE DOWN
1470 CO = 1: GOSUB 1600
1480 GOTO 1950
1490 REM MOVE UP
1500 CO = 1: GOSUB 1530
1510 GOTO 1950
1520 REM ******************
1530 REM MOVE CO UP
1540 FA = 1: GOSUB 1670: REM SAVE
1550 NF = 1:OF = 4: GOSUB 1690
1560 NF = 4:OF = 7: GOSUB 1690
1570 NF = 7:OF = 10: GOSUB 1690
1580 FA = 10: GOSUB 1680
1590 RETURN
1600 REM MOVE CO DOWN
1610 FA = 10: GOSUB 1670: REM SAVE
1620 NF = 10:OF = 7: GOSUB 1690
1630 NF = 7:OF = 4: GOSUB 1690
1640 NF = 4:OF = 1: GOSUB 1690
1650 FA = 1: GOSUB 1680
1660 RETURN
1670 FOR RO = 0 TO 2:HC(RO,CO) = NC(FA,RO,CO): NEXT RO: RETURN
1680 FOR RO = 0 TO 2:NC(FA,RO,CO) = HC(RO,CO): NEXT RO: RETURN
1690 FOR RO = 0 TO 2:NC(NF,RO,CO) = NC(OF,RO,CO): NEXT RO: RETURN
1700 REM MOVE RO RIGHT
1710 FA = 4: GOSUB 1840: REM SAVE
1720 NF = 4:OF = 3: GOSUB 1860
1730 NF = 3:OF = 10: GOSUB 1870
1740 NF = 10:OF = 5: GOSUB 1880
1750 FA = 5: GOSUB 1850
1760 RETURN
1770 REM MOVE RO LEFT
1780 FA = 4: GOSUB 1840: REM SAVE
1790 NF = 4:OF = 5: GOSUB 1860
1800 NF = 5:OF = 10: GOSUB 1870
1810 NF = 10:OF = 3: GOSUB 1880
1820 FA = 3: GOSUB 1850
1830 RETURN
1840 FOR CO = 0 TO 2:HC(RO,CO) = NC(FA,RO,CO): NEXT CO: RETURN
1850 FOR CO = 0 TO 2:NC(FA,RO,CO) = HC(RO,CO): NEXT CO: RETURN
1860 FOR CO = 0 TO 2:NC(NF,RO,CO) = NC(OF,RO,CO): NEXT CO: RETURN
1870 FOR CO = 0 TO 2:NC(NF,RO,CO) = NC(OF,2 -RO,2 -CO): NEXT CO: RETURN
1880 FOR CO = 0 TO 2:NC(NF,2 -RO,CO) = NC(OF,RO,2 -CO): NEXT CO: RETURN
1890 REM COPY FACE OF TO NF
1900 FOR RO = 0 TO 2
1910 FOR CO = 0 TO 2
1920 NC(NF,RO,CO) = NC(OF,RO,CO)
1930 NEXT CO: NEXT RO
1940 RETURN
1950 GOSUB 340: GOSUB 70
1960 GOTO 770
1970 REM BLINK JOYSTK POSITION
1980 PO$ = "C": REM DEFAULT
1990 REM READ JOYSTICK
2000 IF PDL(0) <50 AND PDL(1) >50 THEN PO$ = "L"
2010 IF PDL(0) >200 AND PDL(1) >50 THEN PO$ = "R"
2020 IF PDL(1) <50 AND PDL(0) >50 THEN PO$ = "T"
2030 IF PDL(1) >200 AND PDL(0) >50 THEN PO$ = "B"
2040 RO = 1:CO = 1
2050 IF PO$ = "L" THEN CO = 0
2060 IF PO$ = "R" THEN CO = 2
2070 IF PO$ = "T" THEN RO = 0
2080 IF PO$ = "B" THEN RO = 2
2090 HC(RO,CO) = NC(4,RO,CO):NC(4,RO,CO) = BK
2100 GOSUB 2140
2110 NC(4,RO,CO) = HC(RO,CO)
2120 GOSUB 2140
2130 RETURN
2140 REM DRAW SQUARE AT FA,RO,CO
2150 FA = 4
2160 X = (FA - INT(FA/3) *3) *9 +CO *3 +6
2170 Y = INT(FA/3) *12 +RO *4
2180 COLOR= NC(FA,RO,CO)
2190 GOSUB 30
2200 RETURN
2210 REM *********************
2220 REM TERMINATION PROCEDURE
2230 POKE -16368,0: REM KBD STROBE
2240 TEXT : HOME : PRINT " DO YOU WANT TO SAVE THIS GAME ?": GET Z$: PRINT Z$: IF Z$ = "Y" THEN 2270
2250 PRINT : PRINT : PRINT : PRINT " DO YOU WANT TO CONTINUE PLAYING ?": GET Z$: PRINT Z$: IF Z$ = "N" THEN END
2260 X$ = "Y": GOTO 2680
2270 D$ = CHR$(4): PRINT D$"OPEN COLOR CUBE OLD GAME"
2280 PRINT D$"WRITE COLOR CUBE OLD GAME"
2290 FA = 3: GOSUB 2320:FA = 1: GOSUB 2320:FA = 5: GOSUB 2320:FA = 4: GOSUB 2320:F<CTRL-A>A = 7: GOSUB 2320:FA = 10: GOSUB 2320
2300 PRINT D$"CLOSE COLOR CUBE OLD GAME"
2310 GOTO 2250
2320 FOR RO = 0 TO 2: FOR CO = 0 TO 2: PRINT NC(FA,RO,CO): NEXT CO: NEXT RO: RETURN
2330 REM *********************
2340 REM INITIALIZATION
2350 REM
2360 REM COLOR ASSIGNMENT
2370 BK = 0:RD = 1:BL = 2:GN = 4:BR = 8:NG = 9:YE = 13:WH = 15
2380 DIM NC(11,2,2),HC(2,2)
2390 HOME : VTAB 10: HTAB 5: INVERSE : PRINT "*** THE MAD MAD MAD MAD CUBE ***": NORMAL : HTAB 15: PRINT "BY RICH HATCHER": PRINT : HTAB 10: PRINT "COPYRIGHT (C) 1981 BY": HTAB 10: PRINT " MICRO-SPARC, INC.": HTAB 10: PRINT " LINCOLN, MA 01773"
2400 PRINT : PRINT "DO YOU WANT INSTRUCTIONS ?": GET Y$: PRINT Y$: IF Y$ = "Y" THEN GOSUB 2900
2410 HOME : PRINT "DO YOU WANT TO SET UP ?": GET X$: PRINT X$: IF X$ = "N" THEN 2660
2420 HOME : PRINT " RED =R": PRINT " BLUE =B": PRINT " GREEN =G": PRINT " ORANGE =O": PRINT " YELLOW =Y": PRINT " WHITE =W": PRINT : PRINT : POKE 34,7
2430 F$ = "FRONT FACE":FA = 4: GOSUB 2500
2440 F$ = "LEFT FACE":FA = 3: GOSUB 2500
2450 F$ = "RIGHT FACE":FA = 5: GOSUB 2500
2460 F$ = "TOP FACE":FA = 1: GOSUB 2500
2470 F$ = "BOTTOM FACE":FA = 7: GOSUB 2500
2480 F$ = "REAR FACE":FA = 10: GOSUB 2500
2490 TEXT : GOTO 2680
2500 FOR RO = 0 TO 2: FOR CO = 0 TO 2: PRINT F$", ROW "RO", COLUMN "CO", ";: GOSUB 2510:NC(FA,RO,CO) = C: NEXT CO: NEXT RO: RETURN
2510 GET C$: IF C$ = "R" THEN C = RD
2520 IF C$ = "B" THEN C = BL
2530 IF C$ = "G" THEN C = GN
2540 IF C$ = "O" THEN C = NG
2550 IF C$ = "Y" THEN C = YE
2560 IF C$ = "W" THEN C = WH
2570 IF C$ = "R" OR C$ = "B" OR C$ = "G" OR C$ = "O" OR C$ = "Y" OR C$ = "W" THEN 2590
2580 PRINT CHR$(7);: GOTO 2510
2590 IF C$ = "R" THEN PRINT "RED"
2600 IF C$ = "B" THEN PRINT "BLUE"
2610 IF C$ = "G" THEN PRINT "GREEN"
2620 IF C$ = "O" THEN PRINT "ORANGE"
2630 IF C$ = "Y" THEN PRINT "YELLOW"
2640 IF C$ = "W" THEN PRINT "WHITE"
2650 RETURN
2660 HOME : PRINT "DO YOU WANT TO CONTINUE PREVIOUS SET UP?": GET X$: PRINT X$: IF X$ = "Y" THEN 2740
2670 REM INITIALIZE GRAPHICS
2680 GR : POKE -16302,0: COLOR= BK: FOR Y = 40 TO 47: HLIN 0,39 AT Y: NEXT Y
2690 COLOR= BR
2700 FOR R = 0 TO 2: HLIN 6,31 AT R *12 +11: NEXT R
2710 FOR C = 0 TO 1: VLIN 0,46 AT C *9 +14: NEXT C
2720 IF X$ = "Y" THEN 2880
2730 GOTO 2820
2740 REM READ FROM DISK
2750 D$ = CHR$(4): PRINT D$"OPEN COLOR CUBE OLD GAME"
2760 PRINT D$"READ COLOR CUBE OLD GAME"
2770 F = 3: GOSUB 2800:F = 1: GOSUB 2800:F = 5: GOSUB 2800:F = 4: GOSUB 2800:F = 7: GOSUB 2800:F = 10: GOSUB 2800
2780 : PRINT D$"CLOSE COLOR CUBE OLD GAME"
2790 GOTO 2680
2800 FOR RO = 0 TO 2: FOR CO = 0 TO 2: INPUT NC(F,RO,CO): NEXT CO: NEXT RO: RETURN
2810 REM ******************** DEFAULT INITIALIZATION
2820 FA = 3:CL = RD: GOSUB 2890
2830 FA = 1:CL = BL: GOSUB 2890
2840 FA = 5:CL = YE: GOSUB 2890
2850 FA = 4:CL = GN: GOSUB 2890
2860 FA = 7:CL = NG: GOSUB 2890
2870 FA = 10:CL = WH: GOSUB 2890
2880 GOSUB 340: GOSUB 70: GOTO 770: REM BEGIN PLAY
2890 FOR RO = 0 TO 2: FOR CO = 0 TO 2:NC(FA,RO,CO) = CL: NEXT CO: NEXT RO: RETURN
2900 : HOME : PRINT "THIS IS A FLAT VERSION OF A THREE DIMENSIONAL COLORED CUBE."
2910 PRINT
2920 PRINT "EACH SIDE IS NINE SQUARES AND STARTS WITH ALL SQUARES OF ONE COLOR"
2930 PRINT
2940 PRINT "EACH SIDE MAY BE ROTATED WHICH MIXES THE COLORS VERY QUICKLY."
2950 PRINT
2960 PRINT "THE SCREEN SHOWS THE FRONT FACE WITH THE LEFT, RIGHT, TOP, AND BOTTOM FACES SURROUNDING IT AS IF THEY WERE UNFOLDED"
2970 PRINT
2980 PRINT "THE REAR FACE IS SHOWN UNFOLDED FROM THE BOTTOM."
2990 PRINT
3000 PRINT "THE LEFT AND RIGHT FACES ARE SHOWN ROTATED ON EITHER SIDE OF THE TOP, BOTTOM AND REAR FACES."
3010 VTAB 23: PRINT "HIT SPACE BAR FOR MORE": GET Y$: PRINT Y$: HOME
3020 PRINT "TO ROTATE A SECTION, THE PADDLE INPUTS ARE USED IN TWO STEPS (A JOYSTICK IS ASSUMED)."
3030 PRINT
3040 PRINT "POSITION THE JOYSTICK IN THE ROW OR COLUMN OF THE FRONT FACE (BLINKING) THAT YOU WISH TO ROTATE."
3050 PRINT "VISUALIZE THE FRONT FACE (BLINKING)"
3060 PRINT "WITH THE JOYSTICK IN FIVE POSITIONS"
3070 PRINT "LEFT; RIGHT; TOP; BOTTOM; AND CENTER"
3080 PRINT
3090 PRINT " T"
3100 PRINT " ."
3110 PRINT " ."
3120 PRINT " L...C...R"
3130 PRINT " ."
3140 PRINT " ."
3150 PRINT " B"
3160 PRINT : PRINT : PRINT " NOW PUSH BUTTON (0)"
3170 VTAB 23: PRINT "HIT SPACE BAR FOR MORE": GET Y$: PRINT Y$: HOME
3180 PRINT "AFTER CHOOSING ONE OF THE FIVE THEN"
3190 PRINT "THEN MOVE THE JOYSTICK UP OR DOWN OR LEFT OR RIGHT IN THE DIRECTION OF MOVEMENT"
3200 PRINT : PRINT "TO ROTATE THE ENTIRE CUBE USE BUTTON(1)"
3210 PRINT "WITH THE JOYSTICK IN THE CENTER."
3220 PRINT : PRINT "THEN MOVE THE JOYSTICK IN THE DIRECTION"
3230 PRINT "YOU WISH TO ROTATE."
3240 PRINT : PRINT "AFTER EACH CHANGE, THE SPEAKER BEEPS"
3250 PRINT "TO SIGNAL IT IS READY FOR THE NEXT INPUT"
3260 PRINT
3270 PRINT "A SETUP MAY BE INPUT MANUALLY AND A CURRENT POSITION MAY BE SAVED TO DISK AND READ FROM DISK."
3280 PRINT
3290 PRINT " HIT ANY KEY TO STOP THE GAME"
3300 VTAB 23: PRINT " HIT SPACE TO BEGIN": GET Y$: PRINT Y$
3310 RETURN